package com.imooc.coupon.schedule;

import com.imooc.coupon.entity.CouponTemplate;
import com.imooc.coupon.support.vo.TemplateRule;
import com.imooc.coupon.repository.CouponTemplateRepo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 定时清理已过期的优惠券模板
 *
 * Created By TINY
 * Create Time 2020/2/10
 **/
@Slf4j
@Component
public class ScheduledTask {

    /** CouponTemplate持久层对象 */
    private final CouponTemplateRepo templateRepo;

    @Autowired
    public ScheduledTask(CouponTemplateRepo templateRepo) {
        this.templateRepo = templateRepo;
    }

    /**
     * 定时（1 小时）下线已过期的优惠券模板
     */
    @Scheduled(fixedRate = 60 * 60 * 1000)
    public void offlineCouponTemplate() {

        log.info("开始清理过期的优惠券模板......");

        // 查询所有没有过期的优惠券模板
        List<CouponTemplate> templates =
                templateRepo.findAllByExpired(false);

        // 所有优惠券模板都是过期的，不执行任何操作
        if (CollectionUtils.isEmpty(templates)) {
            log.info("过期模板清理任务结束，没有执行任何清理操作！");
            return;
        }

        Date currentTime = new Date(); // 记录当前时间

        // 已过期的优惠券模板集合
        List<CouponTemplate> expiredTemplates =
                new ArrayList<>(templates.size());

        templates.forEach(t -> {
            // 根据优惠券模板规则中的 “过期规则” 校验模板是否过期
            TemplateRule rule = t.getRule();

            // 优惠券模板过期，加入过期模板集合
            if (rule.getExpiration().getDeadLine() < currentTime.getTime()) {
                t.setExpired(true);

                expiredTemplates.add(t);
            }
        });

        // 需要清理的模板个数不为空，执行清理操作
        if (CollectionUtils.isNotEmpty(expiredTemplates)) {
            log.info("过期模板清理任务结束，清理了 {} 个过期模板",
                    templateRepo.saveAll(expiredTemplates));
        }
    }
}
